home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok11
/
r.o.m.
/
m2sources
/
stringinout.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
12KB
|
394 lines
IMPLEMENTATION MODULE StringInOut;
(*
Created: 10.11.1987
Changed: 18.1.88/07.02.88/29.02.88/25.7.88/11.9.88/10.10.88 by
Stefan Salewski
Stolper Weg 3
2160 Stade West-Germany
Tel: 04141/61130
Note: compiled with AMIGA Modula-2 System by AMSoft Version from 5.5.88
This Module may be freely copied. But please
leave my name in. Thanks....Stefan
*)
FROM SYSTEM IMPORT ADR,LONGSET,REG;
FROM Arts IMPORT Assert;
FROM MyUties IMPORT Min;
FROM DeactivateGadget IMPORT PressRButton;
FROM Intuition IMPORT NewWindow,WindowPtr,Gadget,StringInfo,IntuiText,
WindowFlags,WindowFlagSet,IDCMPFlags,IDCMPFlagSet,OpenWindow,CloseWindow,
PrintIText,GadgetFlagSet,ActivationFlags,ActivationFlagSet,
ScreenFlags,ScreenFlagSet,strGadget,IntuiMessagePtr,
AddGadget,ActivateGadget,RemoveGadget,RefreshGadgets,ModifyIDCMP;
FROM Exec IMPORT GetMsg,ReplyMsg,WaitPort,CopyMem,UByte;
FROM Graphics IMPORT ScrollRaster,RectFill,SetAPen,jam1;
FROM Preference IMPORT CharSize;
FROM Strings IMPORT Length;
FROM Storage IMPORT ALLOCATE,DEALLOCATE;
CONST BufferLength=255;
TYPE
String=ARRAY[0..79] OF CHAR;
WindowDates=RECORD
spalte:INTEGER;
zeile:INTEGER;
bg,inC,outC:INTEGER;
clearIn:BOOLEAN;
offSet:INTEGER;
END;
WindowDatesPtr=POINTER TO WindowDates;
WindowTitle=ARRAY[0..70] OF CHAR;
WindowTitlePtr=POINTER TO WindowTitle;
VAR
charHeight,charWidth:INTEGER;
PROCEDURE ClearWindow(wP:WindowPtr);
VAR oldAPen:CARDINAL;
wDatesPtr:WindowDatesPtr;
BEGIN
Assert(wP#NIL,ADR('StringInOut:Cannot Clear Window'));
wDatesPtr:=WindowDatesPtr(wP^.userData);
oldAPen:=wP^.rPort^.fgPen;
SetAPen(wP^.rPort,wDatesPtr^.bg);
RectFill(wP^.rPort,0,0,wP^.width,wP^.height);
SetAPen(wP^.rPort,oldAPen);
wDatesPtr^.zeile:=1;
wDatesPtr^.offSet:=0;
END ClearWindow;
PROCEDURE SetClear(wP:WindowPtr;clearInput:BOOLEAN);
VAR wDatesPtr:WindowDatesPtr;
BEGIN
Assert(wP#NIL,ADR('StringInOut:Cannot SetClear'));
wDatesPtr:=WindowDatesPtr(wP^.userData);
wDatesPtr^.clearIn:=clearInput
END SetClear;
PROCEDURE SetColors(wP:WindowPtr;background,input,output:INTEGER);
VAR wDatesPtr:WindowDatesPtr;
BEGIN
Assert(wP#NIL,ADR('StringInOut:Cannot SetColors'));
wDatesPtr:=WindowDatesPtr(wP^.userData);
wDatesPtr^.bg:=ABS(background MOD 4);
wDatesPtr^.inC:=ABS(input MOD 4);
wDatesPtr^.outC:=ABS(output MOD 4);
END SetColors;
PROCEDURE SetPos(wP:WindowPtr;x,y:INTEGER);
VAR wDatesPtr:WindowDatesPtr;
BEGIN
Assert(wP#NIL,ADR('StringInOut:Cannot SetPos'));
wDatesPtr:=WindowDatesPtr(wP^.userData);
x:=ABS(x MOD 80);
y:=ABS((y-1) MOD 32)+1;
IF (x+1)*charWidth <= wP^.gzzWidth THEN
wDatesPtr^.spalte:=x
ELSE
wDatesPtr^.spalte:=(wP^.gzzWidth DIV charWidth)-1;
END;
IF y*charHeight<=wP^.gzzHeight THEN
wDatesPtr^.zeile:=y
ELSE
wDatesPtr^.zeile:=wP^.gzzHeight DIV charHeight
END;
wDatesPtr^.offSet:=0
END SetPos;
PROCEDURE GetPos(wP:WindowPtr;VAR x,y:INTEGER);
VAR wDatesPtr:WindowDatesPtr;
BEGIN
Assert(wP#NIL,ADR('StringInOut:Cannot GetPos'));
wDatesPtr:=WindowDatesPtr(wP^.userData);
x:=wDatesPtr^.spalte+wDatesPtr^.offSet;
y:=wDatesPtr^.zeile;
END GetPos;
PROCEDURE Scrollup(wP:WindowPtr;x:INTEGER);
VAR oldAPen:CARDINAL;
wDatesPtr:WindowDatesPtr;
BEGIN
Assert(wP#NIL,ADR('StringInOut:Cannot Scroll Window'));
ScrollRaster(wP^.rPort,0,x,0,0,wP^.width,wP^.height);
wDatesPtr:=WindowDatesPtr(wP^.userData);
oldAPen:=wP^.rPort^.fgPen;
SetAPen(wP^.rPort,wDatesPtr^.bg);
RectFill(wP^.rPort,0,wP^.gzzHeight-x,wP^.width,wP^.height);
SetAPen(wP^.rPort,oldAPen);
END Scrollup;
PROCEDURE WriteString(wP:WindowPtr;s:ARRAY OF CHAR;newLine:BOOLEAN);
VAR iText:IntuiText;
wDatesPtr:WindowDatesPtr;
xx:INTEGER;
BEGIN
Assert(wP#NIL,ADR('StringInOut:Cannot WriteString'));
wDatesPtr:=WindowDatesPtr(wP^.userData);
xx:=wDatesPtr^.spalte+wDatesPtr^.offSet;
WITH iText DO
frontPen:=wDatesPtr^.outC;
backPen:=wDatesPtr^.bg;
drawMode:=jam1;
leftEdge:=0;
topEdge:=0;
iTextFont:=NIL;
iText:=ADR(s);
nextText:=NIL;
END;
IF (wDatesPtr^.zeile*charHeight <= wP^.gzzHeight) THEN
PrintIText(wP^.rPort,ADR(iText),xx*charWidth,charHeight*
(wDatesPtr^.zeile-1));
INC(wDatesPtr^.zeile);
ELSE
Scrollup(wP,charHeight);
PrintIText(wP^.rPort,ADR(iText),xx*charWidth,
charHeight*(wDatesPtr^.zeile-2));
END;
IF newLine THEN
wDatesPtr^.offSet:=0
ELSE
DEC(wDatesPtr^.zeile);
wDatesPtr^.offSet:=wDatesPtr^.offSet+Length(s);
IF (wDatesPtr^.offSet+wDatesPtr^.spalte+1)*charWidth> wP^.gzzWidth THEN
wDatesPtr^.offSet:=(wP^.gzzWidth DIV charWidth)-wDatesPtr^.spalte-1;
END;
END;
END WriteString;
PROCEDURE GetKey(wP:WindowPtr):CHAR;
VAR msg:IntuiMessagePtr;
newIDCMPFlagSet,oldIDCMPFlagSet:IDCMPFlagSet;
msgcode:CARDINAL;
BEGIN
Assert(wP#NIL,ADR('StringInOut:Cannot Get Key'));
oldIDCMPFlagSet:=wP^.idcmpFlags;
newIDCMPFlagSet:=wP^.idcmpFlags-IDCMPFlagSet{rawKey};
newIDCMPFlagSet:=newIDCMPFlagSet+IDCMPFlagSet{vanillaKey};
ModifyIDCMP(wP,newIDCMPFlagSet);
msgcode:=0;
WaitPort(wP^.userPort);
msg:=IntuiMessagePtr(REG(0));
IF vanillaKey IN msg^.class THEN
(*IF wP^.messageKey^.class= IDCMPFlagSet{vanillaKey} THEN
Reg(0) ist sicherer
*)
inputOK:=TRUE;
msg:=GetMsg(wP^.userPort);
msgcode:=msg^.code;
ReplyMsg(msg)
ELSE
inputOK:=FALSE
END;
ModifyIDCMP(wP,oldIDCMPFlagSet);
RETURN CHAR(msgcode);
END GetKey;
PROCEDURE ReadString(wP:WindowPtr;text:ARRAY OF CHAR;
VAR str:ARRAY OF CHAR;sichtbareZeichen:StrGadgetLaenge);
VAR position:INTEGER;
ok,fine:BOOLEAN;
msg:IntuiMessagePtr;
oldIDCMPFlagSet:IDCMPFlagSet;
wDatesPtr:WindowDatesPtr;
stringGadget:Gadget;
myStringInfo:StringInfo;
myUndoBuffer,myBuffer:ARRAY[0..BufferLength] OF CHAR;
strGaIText:IntuiText;
xx:INTEGER;
oldAPen:CARDINAL;
BEGIN
Assert(wP#NIL,ADR('StringInOut:Cannot ReadString'));
wDatesPtr:=WindowDatesPtr(wP^.userData);
xx:=wDatesPtr^.spalte+wDatesPtr^.offSet;
IF (xx+INTEGER(sichtbareZeichen))*charWidth>wP^.gzzWidth THEN
sichtbareZeichen:= wP^.gzzWidth DIV charWidth;
END;
IF wDatesPtr^.clearIn THEN str[0]:=0C END;
IF (wDatesPtr^.zeile*charHeight <= wP^.gzzHeight) THEN
INC(wDatesPtr^.zeile);
ELSE
Scrollup(wP,charHeight);
END;
WITH stringGadget DO
nextGadget:=NIL;
IF (charWidth*(Length(text)+xx+INTEGER(sichtbareZeichen)))<=
wP^.gzzWidth THEN
leftEdge:=(charWidth*(Length(text)+xx))
ELSE
leftEdge:=wP^.gzzWidth-INTEGER(sichtbareZeichen)*charWidth
END;
topEdge:=(wDatesPtr^.zeile-2)*charHeight;
width:=INTEGER(sichtbareZeichen)*charWidth;
height:=charHeight;
flags:=GadgetFlagSet{};
activation:=ActivationFlagSet{relVerify};
gadgetType:=strGadget;
gadgetRender:=NIL;
selectRender:=NIL;
gadgetText:=ADR(strGaIText);
mutualExclude:=LONGSET{};
specialInfo:=ADR(myStringInfo);
gadgetID:=1;
userData:=NIL;
END;
WITH myStringInfo DO
buffer:=ADR(str);
undoBuffer:=ADR(myUndoBuffer);
bufferPos:=0;
IF HIGH(str) < 255 THEN
maxChars:=HIGH(str)+1
ELSE maxChars:=255
END;
dispPos:=0;
END;
WITH strGaIText DO
frontPen:=wDatesPtr^.inC;
backPen:=wDatesPtr^.bg;
drawMode:=jam1;
leftEdge:=-charWidth*Length(text);
topEdge:=0;
iTextFont:=NIL;
iText:=ADR(text);
nextText:=NIL;
END;
oldIDCMPFlagSet:=wP^.idcmpFlags;
ModifyIDCMP(wP,wP^.idcmpFlags + IDCMPFlagSet{gadgetUp});
position:=AddGadget(wP,ADR(stringGadget),-1);
RefreshGadgets(ADR(stringGadget),wP,NIL);
ok:=ActivateGadget(ADR(stringGadget),wP,NIL);
WaitPort(wP^.userPort);
msg:=IntuiMessagePtr(REG(0));
IF gadgetUp IN msg^.class THEN
(* IF (wP^.messageKey^.class = IDCMPFlagSet{gadgetUp}) THEN
Reg(0) ist sicherer *)
msg:=GetMsg(wP^.userPort);
ReplyMsg(msg);
inputOK:=TRUE;
ELSE
inputOK:=FALSE;
END;
IF NOT inputOK THEN
ModifyIDCMP(wP,IDCMPFlagSet{closeWindow});
(* Damit PressRButton keine Message an mein Fenster schickt;
IDCMPFlagSet{} wuerde den MsgPort schliessen, daher closeWindow
*)
IF PressRButton() THEN END;
oldAPen:=wP^.rPort^.fgPen;
SetAPen(wP^.rPort,wDatesPtr^.bg);
RectFill(wP^.rPort,0,stringGadget.topEdge,wP^.width,
stringGadget.topEdge+charHeight-1);
SetAPen(wP^.rPort,oldAPen);
DEC(wDatesPtr^.zeile);
END;
position:=RemoveGadget(wP,ADR(stringGadget));
ModifyIDCMP(wP,oldIDCMPFlagSet);
wDatesPtr^.offSet:=0;
END ReadString;
PROCEDURE DeleteChar(wP:WindowPtr;chars:INTEGER);
VAR
oldAPen:CARDINAL;
x1,x2:INTEGER;
wDatesPtr:WindowDatesPtr;
BEGIN
Assert(wP#NIL,ADR('StringInOut:Cannot DeleteChar'));
wDatesPtr:=WindowDatesPtr(wP^.userData);
x1:=wDatesPtr^.spalte+wDatesPtr^.offSet;
x2:=Min((x1+chars)*charWidth,wP^.gzzWidth);
x1:=Min(x1*charWidth,wP^.gzzWidth);
oldAPen:=wP^.rPort^.fgPen;
SetAPen(wP^.rPort,wDatesPtr^.bg);
RectFill(wP^.rPort,x1,charHeight*(wDatesPtr^.zeile-1),
x2,charHeight*wDatesPtr^.zeile-1);
SetAPen(wP^.rPort,oldAPen);
END DeleteChar;
PROCEDURE OpenNewWindow(VAR wP:WindowPtr;x,y,w,h:INTEGER;wFlags:FlagSet;
titel:ARRAY OF CHAR);
CONST
BLeft=4;
BRight=4;
BBottom=2;
VAR newWindow:NewWindow;
wDPtr:WindowDatesPtr;
wTPtr:WindowTitlePtr;
help:WindowTitle;
bTop:[-1..12];
BEGIN
IF wFlags=FlagSet{} THEN
bTop:=2
ELSE
bTop:=charHeight+3
END;
ALLOCATE(wTPtr,Length(titel));
CopyMem(ADR(titel),wTPtr,Length(titel));
ALLOCATE(wDPtr,SIZE(WindowDates));
WITH wDPtr^ DO
spalte:=0;
zeile:=1;
bg:=2;
inC:=3;
outC:=3;
clearIn:=TRUE;
offSet:=0;
END;
x:=ABS(x MOD 640);
y:=ABS(y MOD 256);
w:=w*charWidth+BLeft+BRight;
w:=ABS(w MOD 640);
w:=Min(w,639-x);
h:=h*charHeight+bTop+BBottom;
h:=ABS(h MOD 255);
h:=Min(h,255-y);
WITH newWindow DO
leftEdge:=x;
topEdge:=y;
width:=w;
height:=h;
detailPen:=0;
blockPen:=1;
idcmpFlags:=IDCMPFlagSet{};
flags:=WindowFlagSet{activate,gimmeZeroZero,noCareRefresh};
IF close IN wFlags THEN
flags:=flags+WindowFlagSet{windowClose};
idcmpFlags:=IDCMPFlagSet{closeWindow};
END;
IF drag IN wFlags THEN
flags:=flags+WindowFlagSet{windowDrag}
END;
IF depth IN wFlags THEN
flags:=flags+WindowFlagSet{windowDepth}
END;
type:=ScreenFlagSet{wbenchScreen};
firstGadget:=NIL;
checkMark:=NIL;
IF wFlags=FlagSet{} THEN
title:=NIL
ELSE
title:=wTPtr
END;
screen:=NIL;
bitMap:=NIL;
minWidth:=w;
minHeight:=h;
maxWidth:=w;
maxHeight:=h;
END;
wP:=OpenWindow(newWindow);
Assert(wP#NIL,ADR('StringInOut:Cannot open Window'));
IF wP#NIL THEN
wP^.userData:=wDPtr;
ClearWindow(wP);
END;
END OpenNewWindow;
PROCEDURE CloseNewWindow(wP:WindowPtr);
BEGIN
Assert(wP#NIL,ADR('StringInOut:Cannot Close Window'));
DEALLOCATE(wP^.userData,SIZE(WindowDates));
DEALLOCATE(wP^.title,SIZE(WindowTitle));
CloseWindow(wP);
END CloseNewWindow;
BEGIN
CharSize(charWidth,charHeight);
END StringInOut.mod